/* (C)oded by ESPRIT 2014 - 3B2 - Undrained Group*/
/* Par: Harzli Joumen & Ben Othman Marouene */

#include "patient.h"
#include "parcours.h"
#include "personnel.h"
#include "login.h"
#include "debug.h"
#include "gestion_personnels.h"
#include "gestion_patients.h"
#include "gestion_parcours.h"
#include "alertes.h"
#include "dessiner.h" // utiliser pour afficher les menus
#include "magasin.h"
#include "gestion_magasin.h"

#include <stdio.h>
#include <stdlib.h>

#define MAX 100


void banner()
{
	printf("\n");
	dessiner_ligne(46);
	dessiner_milieu(46,"Systeme d'analyse");printf("\n");
	dessiner_milieu(46,"d'evenements ");printf("\n");
	dessiner_ligne(46);
}

void afficher_choix(char variable[])
{
	dessiner_ligne(46);
        dessiner_milieu(46,"1/ Afficher la liste des %ss",variable);
	printf("\n");
        dessiner_milieu(46,"2/ Ajouter un %s",variable);
        printf("\n");
	dessiner_milieu(46,"3/ Supprimer un %s",variable);
        printf("\n");
        dessiner_milieu(46,"4/ Modifier un %s",variable);
        printf("\n");
	dessiner_milieu(46,"5/ Initialisation de la liste des %ss",variable);
        printf("\n");
	dessiner_milieu(46,"0/ Retour");
	printf("\n");
	dessiner_ligne(46);
}

void afficher_choix_parcours(char variable[])
{
	dessiner_ligne(46);
        dessiner_milieu(46,"1/ Afficher la liste des %ss",variable);
	printf("\n");
        dessiner_milieu(46,"2/ Ajouter un %s",variable);
        printf("\n");
	dessiner_milieu(46,"3/ Supprimer un %s",variable);
        printf("\n");
        dessiner_milieu(46,"4/ Modifier un %s",variable);
        printf("\n");
	dessiner_milieu(46,"5/ Initialisation de la liste des %ss",variable);
        printf("\n");
    dessiner_milieu(46,"6/ Inserer parcours par default",variable);
        printf("\n");
	dessiner_milieu(46,"0/ Retour");
	printf("\n");
	dessiner_ligne(46);
}

// affiche le login et retourne le type de l'utilisateur
int afficher_login(personnel_db personnel[],int nombre_des_personnels)
{
	int x;

	x=login(personnel,nombre_des_personnels);
	return(x);
}

// affiche la gestion des personnels (desactiver si admin = 0)
void afficher_gestion_personnels(personnel_db personnel[],int *nbre_personnel,int admin)
{
	int choix;
	int id;

	afficher_choix("personnel");
	printf("> ");
	scanf("%d",&choix);


	switch (choix) {
		case 1: {afficher_personnel_db(personnel, *nbre_personnel);afficher_gestion_personnels(personnel,nbre_personnel, admin);}
		break;
		case 2: { ajouter_personnel(personnel, nbre_personnel);afficher_gestion_personnels(personnel,nbre_personnel, admin);}
		break;
		case 3: {
				printf("\n[+] donner l'identifiant: ");
				scanf("%d",&id);
				supprimer_personnel(personnel,id,nbre_personnel);afficher_gestion_personnels(personnel,nbre_personnel, admin);
			}

		break;
		case 4: {modifier_personnel( personnel, *nbre_personnel) ; afficher_gestion_personnels(personnel,nbre_personnel, admin);}
		break;
		case 5: {init_personnel_db(personnel,nbre_personnel);afficher_gestion_personnels(personnel,nbre_personnel, admin);}
		break;
		case 0: {}
		break;
		default: {printf("\nmauvais choix");}
	}
}

// affiche la gestion des patients
void affiche_gestion_patients(patient_db patient[], int *nbre_patient, int admin)
{
        int choix;
        int id;

        afficher_choix("patient");
        printf("> ");
        scanf("%d",&choix);


        switch (choix) {
                case 1: {afficher_patient_db(patient, *nbre_patient);affiche_gestion_patients( patient, nbre_patient, admin);}
                break;
                case 2: { ajouter_patient(patient, nbre_patient);affiche_gestion_patients( patient, nbre_patient, admin);}
                break;
                case 3: {
                                printf("\n[+] donner l'identifiant: ");
                                scanf("%d",&id);
                                supprimer_patient(patient,id,nbre_patient);affiche_gestion_patients( patient, nbre_patient, admin);
                        }

                break;
                case 4: {modifier_patient( patient, *nbre_patient) ; affiche_gestion_patients( patient, nbre_patient, admin);}
                break;
                case 5: {init_patient_db(patient,nbre_patient);affiche_gestion_patients( patient, nbre_patient, admin);}
                break;
                case 0: {}
                break;
                default: {printf("\nmauvais choix");}
        }
}

// affiche la gestion des magasin
void affiche_gestion_magasin(magasin_db magasin[], int *nbre_produit, int admin)
{
        int choix;
        int id;

        afficher_choix("produit");
        printf("> ");
        scanf("%d",&choix);


        switch (choix) {
                case 1: {afficher_magasin(magasin, *nbre_produit);affiche_gestion_magasin( magasin, nbre_produit, admin);}
                break;
                case 2: { ajouter_produit(magasin, nbre_produit);affiche_gestion_magasin( magasin, nbre_produit, admin);}
                break;
                case 3: {
                                printf("\n[+] donner l'identifiant: ");
                                scanf("%d",&id);
								supprimer_produit(magasin,id,nbre_produit);affiche_gestion_magasin( magasin, nbre_produit, admin);
                        }
                break;
				case 4: {modifier_produit( magasin, *nbre_produit) ;affiche_gestion_magasin( magasin, nbre_produit, admin);}
				break;	
				case 5: {init_magasin_db(magasin,nbre_produit);affiche_gestion_magasin( magasin, nbre_produit, admin);}
                break;
                case 0: {}
                break;
                default: {printf("\nmauvais choix");}
        }
}

// affiche la gestion des capteurs ( du parcours )
void affiche_gestion_parcours(parcours_db capteur[], int *nbre_capteur, int admin)
{
        int choix;
        char id[10];

        afficher_choix_parcours("capteur");
        printf("> ");
        scanf("%d",&choix);


        switch (choix) {
                case 1: {afficher_parcours_asuivre(capteur, *nbre_capteur);affiche_gestion_parcours(capteur,nbre_capteur, admin);}
                break;
                case 2: { ajouter_capteur(capteur, nbre_capteur);affiche_gestion_parcours(capteur,nbre_capteur, admin);}
                break;
                case 3: {
                                printf("\n[+] donner l'identifiant: ");
                                fflush(stdin);
                                scanf("%s",id);
                                supprimer_capteur(capteur,id,nbre_capteur);
				affiche_gestion_parcours(capteur,nbre_capteur, admin);
                        }

                break;
                case 4: {modifier_parcours(capteur,nbre_capteur);affiche_gestion_parcours(capteur,nbre_capteur, admin);}
                break;
                case 5: {init_parcours_db(capteur,nbre_capteur);affiche_gestion_parcours(capteur,nbre_capteur, admin);}
                break;
                case 6: {parcours_par_default(capteur,nbre_capteur);affiche_gestion_parcours(capteur,nbre_capteur, admin);}
                break;
                case 0: {}
                break;
                default: {printf("\nmauvais choix");}
        }
}

// affiche les alertes
void afficher_alertes(personnel_db personnel[], int *nombre_des_personnel, patient_db patient[], int *nombre_des_patients, parcours_db parcours_demander[], int nombre_des_capteurs,int admin)
{
	decouvrir_personnel_infecte(personnel, nombre_des_personnel,  patient,  nombre_des_patients,  parcours_demander, nombre_des_capteurs) ;

}

// a propos
void a_propos_()
{
	banner();
	dessiner_milieu(46,"(C)oded by");printf("\n");
	dessiner_milieu(46,"ESPRIT 2014 - 3B2");printf("\n");
	dessiner_milieu(46,"[ Undrained Group ]");printf("\n");
	dessiner_milieu(46,"Harzli Joumen Ali");printf("\n");
	dessiner_milieu(46,"Ben Slimene Marwa");printf("\n");
	dessiner_milieu(46,"Ben Outhman Marouen");printf("\n");
	dessiner_milieu(46,"Khouni Nouha");printf("\n");
	dessiner_milieu(46,"Akrout Atef");printf("\n");
	dessiner_milieu(46,"Jaoua Donia");printf("\n");
	dessiner_ligne(46);

}

int afficher_menu_principale(int admin)
{
	int x;
	banner();
	dessiner_milieu(46,"1/ Afficher alertes");printf("\n");
	dessiner_milieu(46,"2/ Gestion patients");printf("\n");
	dessiner_milieu(46,"3/ Gestion magasin");printf("\n");
	if (admin==1)
	{
		dessiner_milieu(46,"4/ Gestion personnels");printf("\n");
		dessiner_milieu(46,"5/ Gestion parcours");printf("\n");
		dessiner_milieu(46,"6/ Modification d'authentification");printf("\n");
		dessiner_milieu(46,"7/ A propos");printf("\n");

	}
	else if (admin==2)
	{
		dessiner_milieu(46,"4/ A propos");printf("\n");
	}
	dessiner_milieu(46,"0/ Quitter");printf("\n");
	dessiner_ligne(46);

	printf("> ");
	scanf("%d",&x);
	return(x);
}


affiche_gestion_auth(personnel_db personnel[],int nbre_personnel)
{
	int choix;
	dessiner_ligne(46);
	dessiner_milieu(46,"1/ Modifier mot de pass de l'admin");printf("\n");
	dessiner_milieu(46,"2/ Modifier mot de pass d'un personnel");printf("\n");
	dessiner_milieu(46,"0/ Retout");printf("\n");
	dessiner_ligne(46);
        printf("> ");
        scanf("%d",&choix);

        switch (choix) {
                case 1: {modifier_pass_admin();}
                break;
                case 2: {modifier_pass_personnel(personnel,nbre_personnel);}
                break;
                case 0: {}
                break;
                default: {printf("\nmauvais choix");}
        }

}


int main()
{
	int admin; // 2 si l'utilisateur est un personnel 1 si l'utilisateur esta un admin
	patient_db Tab_Patients[MAX];
	personnel_db Tab_Personnels[MAX];
	parcours_db Tab_Parcours[MAX];
	magasin_db Tab_Magasin[MAX];

	int n_capteurs = 0;
	int n_personnels = 0;
	int n_patients = 0;
	int n_produits = 0;
	int choix;
	int quitter = 0;

	debug("Chargement des personnels...");
	extraire_personnels(Tab_Personnels, &n_personnels);

	debug("Chargement des patients...");
	extraire_patients(Tab_Patients, &n_patients);

	debug("Chargement du parcours...");
	extraire_parcours(Tab_Parcours, &n_capteurs);

	debug("Chargement du magasin...");
	extraire_magasin(Tab_Magasin, &n_produits);

	debug("Chargement des evenements...");
	associer_parcours_personnels(Tab_Personnels, n_personnels);
/*
    printf("Le nombre des personnels : %d\n",n_personnels);
    printf("Le nombre des patients : %d\n",n_patients);
    printf("Le nombre des capteurs : %d\n",n_capteurs);
*/

	banner();
	creer_compte_admin();

	admin=afficher_login(Tab_Personnels,n_personnels);
	if (admin==0)
	{
		printf("[!] le nombre d'essaies est fini\n");
		return(0);
	}

	else
	{
		while (( 2> 1)&&(quitter == 0))
		{
		choix=afficher_menu_principale(admin);
		if ( admin == 1)
		{
			switch (choix) {
				case 1: {afficher_alertes(Tab_Personnels,  &n_personnels,  Tab_Patients,  &n_patients, Tab_Parcours,  n_capteurs,admin) ; }
				break;
				case 2:{affiche_gestion_patients(Tab_Patients, &n_patients,admin);}
				break;
				case 3:{affiche_gestion_magasin(Tab_Magasin,&n_produits,admin);}
				break;
				case 4:{afficher_gestion_personnels(Tab_Personnels,  &n_personnels, admin) ; }
				break;
				case 5:{affiche_gestion_parcours(Tab_Parcours, &n_capteurs, admin);}
				break;
				case 6:{affiche_gestion_auth(Tab_Personnels,  n_personnels);}
				break;
				case 7:{a_propos_();}
				break;
				case 0:{quitter = 1;return(0);}
				default: {afficher_menu_principale(admin);printf("\nmauvais choix");}
			}
		}
		else if (admin==2)
		{
			switch (choix) {
				case 1: {afficher_alertes(Tab_Personnels,  &n_personnels,  Tab_Patients,  &n_patients, Tab_Parcours,  n_capteurs,admin) ; }
				break;
				case 2:{affiche_gestion_patients(Tab_Patients, &n_patients,admin);}
				break;
				case 3:{affiche_gestion_magasin(Tab_Magasin,&n_produits,admin);}
				break;
				case 4:{a_propos_();}
				break;
				case 0:{quitter = 1; return(0);}
				default: {afficher_menu_principale(admin);printf("\nmauvais choix");}
			}
		}
		}
	}
	return 0;
}
